package org.vison.wonfu.framework.commons.utils;

import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

public class IpUtils {


    public static String getLocalHostIp() {
        return getNonLoopbackIPv4Addresses().get(0);
    }

    /**
     * 获取本机非回环、非虚拟网卡的IPv4地址列表
     * @return IPv4地址列表
     */
    public static List<String> getNonLoopbackIPv4Addresses() {
        List<String> result = new ArrayList<>();

        try {
            // 遍历所有网络接口
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            while (interfaces.hasMoreElements()) {
                NetworkInterface iface = interfaces.nextElement();

                // 过滤掉虚拟网卡和禁用的网卡
                if (isVirtualInterface(iface) || !iface.isUp()) {
                    continue;
                }

                // 遍历接口上的所有IP地址
                Enumeration<InetAddress> addresses = iface.getInetAddresses();
                while (addresses.hasMoreElements()) {
                    InetAddress addr = addresses.nextElement();

                    // 过滤掉回环地址和IPv6地址
                    if (addr.isLoopbackAddress() || !(addr instanceof Inet4Address)) {
                        continue;
                    }

                    // 添加有效的IPv4地址
                    result.add(addr.getHostAddress());
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }

        return result;
    }

    /**
     * 判断是否为虚拟网卡
     * @param iface 网络接口
     * @return 是否为虚拟网卡
     */
    private static boolean isVirtualInterface(NetworkInterface iface) {
        // 虚拟网卡通常会包含这些关键词
        String displayName = iface.getDisplayName();
        String name = iface.getName();

        // 常见虚拟网卡特征（可根据实际情况扩展）
        return (displayName != null && (
                displayName.contains("Virtual") ||
                        displayName.contains("VMware") ||
                        displayName.contains("VirtualBox") ||
                        displayName.contains("Hyper-V") ||
                        displayName.contains("VPN") ||
                        displayName.contains("Docker") ||
                        displayName.contains("Loopback") ||
                        displayName.contains("Tunnel")  // 隧道接口
        )) ||
                (name != null && (
                        name.startsWith("veth") ||  // Docker虚拟网卡
                                name.startsWith("docker") ||
                                name.startsWith("vmnet") ||  // VMware虚拟网卡
                                name.startsWith("vboxnet") || // VirtualBox虚拟网卡
                                name.startsWith("utun") ||   // macOS的VPN/隧道接口（如utun1, utun2等）
                                name.startsWith("tun") ||    // 通用隧道接口
                                name.startsWith("tap")       // 虚拟以太网接口
                ));
    }
}
